/**
 * 模型
 * 敌方坦克
 */
import AbstractModel from "./abstract/AbstractModel";
import {image} from "../service/image";
import {EnumDirection} from "../enum/enumPosition";

import {random, upperFirst} from 'lodash'
import config from "../config";
import water from "../canvas/Water";
import wallBrick from "../canvas/WallBrick";
import wallSteel from "../canvas/WallSteel";
import tank from "../canvas/Tank";
import utils from "../utils";
import player from "../canvas/Player";

export default class ModelTank extends AbstractModel implements IModel {
    name: string = 'tank';

    // 画布实例
    canvas: ICanvas = tank;
    // 继承父类抽象方法:渲染贴图
    // 一些初始化自定义的动作、行为，都在这里进行
    render(): void {
        // 让坦克动起来：循环定时器
        // setInterval(() => {
        //     this.move()
        // }, 50)

        // 随机转向
        if (random(79) == 1) {
            this.randomDirection()
        }
        // 让坦克动
        this.move()
        // 增加敌方坦克向下移动的概率
        // if (Math.floor(Math.random() * 5) == 1) {
        if (random(79) == 1) {
            this.direction = EnumDirection.bottom
        }
    }

    // 随机取用其中一个图片
    getImage(): HTMLImageElement {
        return image.get(`${this.name}${upperFirst(this.direction)}` as keyof typeof config.images)!
        // let img: HTMLImageElement;
        // switch (this.direction) {
        //     case EnumDirection.top:
        //         img = image.get('tankTop')!
        //         break;
        //     case EnumDirection.right:
        //         img = image.get('tankRight')!
        //         break;
        //     case EnumDirection.bottom:
        //         img = image.get('tankBottom')!
        //         break;
        //     case EnumDirection.left:
        //         img = image.get('tankLeft')!
        //         break;
        //     default:
        //         img = image.get('tankTop')!
        //         break;
        // }
        // return img
    }

    // 坦克行动
    protected move(): void {
        while (true) {
            // 画布清空
            // this.canvas.clearRect(this.x, this.y, config.model.common.width, config.model.common.height);
            // ********************* 坐标更新 *********************
            let x = this.x;
            let y = this.y;
            switch (this.direction) {
                case EnumDirection.top:
                    y -= 2
                    break;
                case EnumDirection.right:
                    x += 2
                    break;
                case EnumDirection.bottom:
                    y += 2
                    break;
                case EnumDirection.left:
                    x -= 2
                    break;
            }
            if (utils.modelTouch(x, y, [
                ...water.models,// 水域
                ...wallBrick.models,// 砖墙
                ...wallSteel.models,// 钢墙
                ...player.models // 我方坦克
            ]) || utils.isCanvasTouch(x, y)) {
                // 随机获取方向
                this.randomDirection()
            } else {
                this.x = x;
                this.y = y;
                // 跳出while死循环
                break;
            }
        }
        // ********************* 坐标更新 *********************
        // 画布重绘, 渲染坦克模型，在这里调用减少重绘次数
        super.draw()
    }


}
